package com.hhf.function;

import java.util.function.Consumer;
import java.util.function.Function;
import java.util.function.Predicate;
import java.util.function.Supplier;

/**
 * @Author hhf
 * @Date 2024/6/13
 * @Description Function方法接口的书写
 * 案例: 判断输入的字符串是否为数字,若为数字,则进行判断奇偶
 */
public class FunctionDemo2 {

    public static void main(String[] args) {

        //1.定义数据提供者函数
        Supplier<String> supplier = () -> "66";

        //2.断言,验证是否为数字
        Predicate<String> predicate = (str) -> str.matches("\\d+");

        //3.转换器,把字符串转换成数字
        Function<String, Integer> function = Integer::parseInt;

        //4.消费者,打印数字
        Consumer<Integer> consumer = (i) -> {
            if (i % 2 == 0) {
                System.out.println("偶数:" + i);
            }else {
                System.out.println("奇数:" + i);
            }
        };


        //all 串在一起,实现66这个字符串是否为偶数
        //可读性非常差
        myMethod(supplier, predicate, function, consumer);

        //**
        myMethod(()->"68abc",
                (str) -> str.matches("\\d+"),
                Integer::parseInt,
                System.out::println);

    }


    //使用idea提取成静态方法
    //选中逻辑 -> 右键 -> Refactor -> abstract Method (快捷键: ctrl+alt+m)
    //从生成的方法中可以看出,需要的参数都是函数式参数,因此我们可以通过**调用
    private static void myMethod(Supplier<String> supplier,
                                 Predicate<String> predicate,
                                 Function<String, Integer> function,
                                 Consumer<Integer> consumer) {
        if (predicate.test(supplier.get())){
            consumer.accept(function.apply(supplier.get()));
        }else {
            System.out.println("这不是数字");
        }
    }
}
